#include "testsqlmodel.h"
#include "ui_testsqlmodel.h"
#include <QSqlQueryModel>
#include <QSqlTableModel>
#include <QSqlRelationalTableModel>
#include <QSqlRelation>
#include <QSqlRelationalDelegate>
#include <QPushButton>
#include <QMessageBox>

TestSqlModel::TestSqlModel(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::TestSqlModel)
{
    ui->setupUi(this);
#if 0
    //QSqlQueryModel
    QString strSql = "SELECT * FROM student2";
    QSqlQueryModel *pModel1 = new QSqlQueryModel();
    pModel1->setQuery(strSql);
    pModel1->setHeaderData(0, Qt::Horizontal, tr("ID"));
    pModel1->setHeaderData(1, Qt::Horizontal, tr("姓名"));
    pModel1->setHeaderData(2, Qt::Horizontal, tr("课程"));
    ui->tableView_dis1->setModel(pModel1);
    ui->tableView_dis1->verticalHeader()->setHidden(true);
    ui->tableView_dis1->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
#endif

#if 1
    //QSqlTableModel
    QSqlTableModel *pModel2 = new QSqlTableModel();
    pModel2->setTable("student");
    pModel2->setSort(0, Qt::DescendingOrder);   //排序
    //    pModel2->setFilter(QString("id >2")); //设置条件
    pModel2->select();
    // 设置编辑策略
    //所有的改变都会在模型中进行缓存，直到调用submitAll()或者reverAll()函数
//    pModel2->setEditStrategy(QSqlTableModel::OnManualSubmit);
    //所有对模型的改变都会立即应用到数据库
//    pModel2->setEditStrategy(QSqlTableModel::OnFieldChange);
    //对一条记录的改变会在用户选择另一条记录时被应用
    pModel2->setEditStrategy(QSqlTableModel::OnRowChange);
    //
    ui->tableView_dis2->setModel(pModel2);
    ui->tableView_dis2->verticalHeader()->setHidden(true);
    ui->tableView_dis2->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
#endif

#if 1
    //QSqlRelationalTableModel
    QSqlRelationalTableModel *pModel3 = new QSqlRelationalTableModel();
    pModel3->setTable("student2");
    pModel3->setRelation(2, QSqlRelation("course", "id", "name"));
    pModel3->select();
    pModel3->setHeaderData(0, Qt::Horizontal, tr("ID"));
    pModel3->setHeaderData(1, Qt::Horizontal, tr("姓名"));
    pModel3->setHeaderData(2, Qt::Horizontal, tr("课程名"));
    ui->tableView_dis1->setModel(pModel3);
    ui->tableView_dis1->verticalHeader()->setHidden(true);
    ui->tableView_dis1->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->tableView_dis1->setItemDelegate(new QSqlRelationalDelegate(ui->tableView_dis1));
#endif


    QPushButton *btnRefresh = new QPushButton(tr("刷新"), this);
    btnRefresh->move(10, 600);
    connect(btnRefresh, &QPushButton::clicked, this, [=](){
//        pModel1->setQuery(strSql);
//        ui->tableView_dis1->setModel(pModel1);
//        pModel2->setTable("student2");
//        pModel2->select();
//        ui->tableView_dis2->setModel(pModel2);
#if 0
        //delete test
        // 获取选中的行
        int curRow = ui->tableView_dis2->currentIndex().row();
        // 删除该行
        pModel2->removeRow(curRow);
        int ok1 = QMessageBox::warning(this,tr("删除当前行!"),
                                       tr("你确定删除当前行吗？"), QMessageBox::Yes, QMessageBox::No);
        if(ok1 == QMessageBox::No)
        { // 如果不删除，则撤销
            pModel2->revertAll();
        } else { // 否则提交，在数据库中删除该行
            pModel2->submitAll();
            pModel2->setTable("student");
            pModel2->select();
            ui->tableView_dis2->setModel(pModel2);
        }
#endif
    });
}

TestSqlModel::~TestSqlModel()
{
    delete ui;
}

void TestSqlModel::on_btn_fresh_clicked()
{
}

